10 ' ***  FFT07-01 *** POSITIVE FREQUENCY FFT ***

12 CLS : PRINT "INPUT NUMBER OF DATA POINTS AS 2^N"

14 INPUT "N = "; N

16 Q = 2 ^ N: N1 = N - 1: Q1 = Q - 1: Q2 = Q / 2: Q3 = Q2 - 1: Q4 = Q / 4: Q5 = Q4 - 1

18 Q8 = Q / 8: Q9 = Q8 - 1: Q34 = Q2 + Q4: Q16 = Q / 16

20 DIM Y(Q), C(Q), S(Q), KC(Q2), KS(Q2)

30 PI = 3.14159265358979#: P2 = PI * 2: K1 = P2 / Q



38 '    ********   MAIN MENU   ********

40 CLS : PRINT SPC(30); "MAIN MENU": PRINT : PRINT

60 PRINT SPC(5); "1 = ANALYZE Q/2 COMPONENT FUNCTION": PRINT

62 PRINT SPC(5); "2 = EXIT": PRINT

70 PRINT SPC(10); "MAKE SELECTION: ";

80 A$ = INKEY$: IF A$ = "" THEN 80

90 A = VAL(A$): ON A GOSUB 600, 900

92 GOTO 40



100 '                *** TRANSFORM ***

108 ' ***  TRANSFORM STAGE 1  ***

110 C(0) = (S(0) + S(Q2)) / 2: C(1) = (S(0) - S(Q2)) / 2

112 FOR I = 1 TO Q3: I2 = 2 * I: INDX = 0

114 FOR J = 0 TO N1: IF I AND 2 ^ J THEN INDX = INDX + 2 ^ (N - 2 - J)

116 NEXT J

118 C(I2) = (S(INDX) + S(INDX + Q2)) / 2: C(I2 + 1) = (S(INDX) - S(INDX + Q2)) / 2

120 NEXT I

122 FOR I = 0 TO Q1: S(I) = 0: NEXT I



 ' *********  SUM REMAINING STAGES  ************

124 FOR M = 1 TO N1: QP = 2 ^ M: QPI = 2 ^ (N1 - M): K0 = QPI * K1

126  FOR K = 0 TO QPI - 1

128   FOR J = 0 TO QP / 2: J0 = J + (2 * K * QP)

130   J1 = J0 + QP: JI = J1 - (2 * J): K2 = K0 * J: K3 = K0 * JI

132   CTEMP1 = C(J0) + C(J1) * COS(K2) - S(J1) * SIN(K2)

134   STEMP1 = S(J0) + C(J1) * SIN(K2) + S(J1) * COS(K2)

136   CTEMP2 = C(J0) + C(J1) * COS(K3) + S(J1) * SIN(K3)

138   S(JI) = (C(J1) * SIN(K3) - S(J1) * COS(K3) - S(J0)) / 2

140   C(J0) = CTEMP1 / 2: S(J0) = STEMP1 / 2: C(JI) = CTEMP2 / 2

142   NEXT J

144  NEXT K

146 NEXT M

148 FOR J = Q2 + 1 TO Q1: C(J) = 0: S(J) = 0: NEXT J

150 SK1 = 2

'   *******   PRINT OUTPUT   *******

160 FOR Z = 0 TO Q3' PRINT OUTPUT

162 PRINT USING "###"; Z; : PRINT "   ";

164 PRINT USING "+##.#####"; SK1 * C(Z); : PRINT "   ";

166 PRINT USING "+##.#####"; SK1 * S(Z); : PRINT "     ";

168 PRINT USING "###"; Z + Q2; : PRINT "   ";

170 PRINT USING "+##.#####"; SK1 * C(Z + Q2); : PRINT "   ";

172 PRINT USING "+##.#####"; SK1 * S(Z + Q2)

174 NEXT Z

176 PRINT : INPUT "ENTER TO CONTINUE"; A$

178 RETURN



600 ' ***  Q/2 COMPONENT FUNCTION  ***

602 CLS : PRINT : PRINT

604 PRINT SPC(10); "1 = TRIANGLE WAVE": PRINT SPC(10); "2 = NYQUEST COMPONENT"

605 A$ = INKEY$: IF A$ = "" THEN 605

606 A = VAL(A$): IF A <> 1 AND A <> 2 THEN 602

608 PRINT "PREPARING DATA - PLEASE WAIT"

610 ON A GOSUB 650, 660

612 SK1 = 1: GOSUB 160

620 GOSUB 100 'TAKE TRANSFORM

630 RETURN 'BACK TO MAIN MENU

650 ' ***  GENERATE Q/2 COMPONENT TRIANGLE ***

652 FOR I = 0 TO Q1: Y(I) = 0: C(I) = 0: S(I) = 0 ' CLEAR DATA POINT

654 FOR J = 1 TO Q2 STEP 2: S(I) = S(I) + COS(K1 * J * I) / (J * J): NEXT

656 NEXT

658 RETURN

660 D = 1' ***  GENERATE NYQUIST COMPONENT ***

662 FOR I = 0 TO Q1: Y(I) = 0: C(I) = 0: S(I) = D ' CLEAR & DATA POINT

666 D = D * (-1): NEXT

668 RETURN



' **********

900 STOP







